package com.chunlin.servlet.cookieandseesion;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取到用户名和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if (username == null || password == null || username.equals("") || password.equals("")) {
            resp.setStatus(400);
            return;
        }

        //2.验证用户名密码是否正确
        if (!"林小磊".equals(username) || !"666".equals(password)) {
            resp.setStatus(401);
            return;
        }

        //3.登录成功,可以给用户创建session了
        //getSession的效果有两个方面:
        //1.如果当前用户没有session（会话），如果参数为true,不存在session,就会创建出session(用户登录的时候使用)
        //如果参数为false,不存在session就返回null(后续跳转到其他页面,检查用户的登录状态是使用)
        //2.如果已经有了session，就能够查询到这个session
        //getSession的原理如下:
        //1.先读取请求中的Cookie，看Cookie里是否有JSESSIONID属性，以及值是多少
        //如果这个JSESSIONID,不存在,那么就认为需要创建新的session
        //如果这个JSESSIONID,存在,那么就查找是否有和JSESSIONID所匹配的session
        //如果session存在,就直接返回这个session
        //如果session不存在,请假认为需要创建新的session
        //2.如果当前确实需要创建会话，就会创建出一个Session对象，同时生成一个唯一的JSESSIONID
        //以JSESSIONID为key，Session对象为value，把这个键值对给插入到服务器的哈希表中
        //3.刚才生成的JSESSIONID又会通过addCookie方法，加入到响应中
        //此时响应里就会带有Set-Cookie字段，这里的值就是JSESSION=xxxxxxxxx
        //通过响应，就把JSESSIONID返回到浏览器这边了
        HttpSession session = req.getSession(true);
        //在会话中,可以顺便保存自定义的数据,比如保存一个登录的时间戳
        //setAttribute后面的value参数,是个Object对象,意思就是可以保存,任意类型的数据
        session.setAttribute("username", username);
        session.setAttribute("timestamp", System.currentTimeMillis());

        resp.setStatus(200);
    }
}
